Visual lab

Feature · canvas

Canvas

The templating language behind every Blutui page: loops, variables, filters and template inheritance in plain HTML.

shipped 3 variants On the board →
v1

Loop to list

once one pass, holds

A for-loop is typed into team.html and the rendered list beside it fills one entry per iteration. Code on the left, result on the right.

views/components/visuals/canvas/v1.html

Static · three placements

Bento card · 320px Static
Canvas — team.html Fig. 11

{% for member in team %}

<article>

<h3>{{ member.name }}</h3>

<p>{{ member.role }}</p>

</article>

{% endfor %}▏

Rendered · /team

Ada Okafor Engineer
Sam Reid Producer
June Park Strategist
views/layouts/team.html 3 iterations · 12ms compiling…
Feature row · 560px Static
Canvas — team.html Fig. 11

{% for member in team %}

<article>

<h3>{{ member.name }}</h3>

<p>{{ member.role }}</p>

</article>

{% endfor %}▏

Rendered · /team

Ada Okafor Engineer
Sam Reid Producer
June Park Strategist
views/layouts/team.html 3 iterations · 12ms compiling…
Hero figure · 880px Static
Canvas — team.html Fig. 11

{% for member in team %}

<article>

<h3>{{ member.name }}</h3>

<p>{{ member.role }}</p>

</article>

{% endfor %}▏

Rendered · /team

Ada Okafor Engineer
Sam Reid Producer
June Park Strategist
views/layouts/team.html 3 iterations · 12ms compiling…

Animated · once

Feature row · 560px
Canvas — team.html Fig. 11

{% for member in team %}

<article>

<h3>{{ member.name }}</h3>

<p>{{ member.role }}</p>

</article>

{% endfor %}▏

Rendered · /team

Ada Okafor Engineer
Sam Reid Producer
June Park Strategist
views/layouts/team.html 3 iterations · 12ms compiling…
v2

Block fills the shell

loop runs on screen

A layout extends the default template: its body block lights up and the hero it defines slides into the slot between the template header and footer. Inheritance rather than output.

views/components/visuals/canvas/v2.html

Static · three placements

Bento card · 320px Static
Canvas — layouts/home.html Fig. 12

{% extends 'templates/default' %}

 

{% block body %}

<section class="hero">

<h1>Book a visit</h1>

</section>

{% endblock %}

Studio
block body

Book a visit

See times
templates/default.html
extends default 1 block · body
Feature row · 560px Static
Canvas — layouts/home.html Fig. 12

{% extends 'templates/default' %}

 

{% block body %}

<section class="hero">

<h1>Book a visit</h1>

</section>

{% endblock %}

Studio
block body

Book a visit

See times
templates/default.html
extends default 1 block · body
Hero figure · 880px Static
Canvas — layouts/home.html Fig. 12

{% extends 'templates/default' %}

 

{% block body %}

<section class="hero">

<h1>Book a visit</h1>

</section>

{% endblock %}

Studio
block body

Book a visit

See times
templates/default.html
extends default 1 block · body

Animated · loop

Feature row · 560px
Canvas — layouts/home.html Fig. 12

{% extends 'templates/default' %}

 

{% block body %}

<section class="hero">

<h1>Book a visit</h1>

</section>

{% endblock %}

Studio
block body

Book a visit

See times
templates/default.html
extends default 1 block · body
c1

Template to page

cutout

once one pass, holds

Cutout on a navy ground: two windows, the editor with views/layouts/home.html in front and the browser with the site it renders behind, both cropped by the frame. The template types out line by line, the preview bar sweeps and the page paints in. The moment is keyboard, so there is no cursor. The preview is a real site screenshot from the CDN — the one visual in the lab with an external image.

views/components/visuals/canvas/c1.html

Static · three placements

Bento card · 320px Static
goldenhomes.co.nz
home.html default.html views/layouts

{% extends 'templates/default.html' %}

 

{% set plans = cms.collection('plans')

| sort_by('order') | slice(0, 3) %}

 

{% block body %}

{{ include('components/hero.html') }}

 

{% for plan in plans %}

<article class="plan">

<h3>{{ plan.name }}</h3>

<p>{{ plan.beds }} bed · {{ plan.baths }} bath</p>

</article>

{% endfor %}

{% endblock %}

Feature row · 560px Static
goldenhomes.co.nz
home.html default.html views/layouts

{% extends 'templates/default.html' %}

 

{% set plans = cms.collection('plans')

| sort_by('order') | slice(0, 3) %}

 

{% block body %}

{{ include('components/hero.html') }}

 

{% for plan in plans %}

<article class="plan">

<h3>{{ plan.name }}</h3>

<p>{{ plan.beds }} bed · {{ plan.baths }} bath</p>

</article>

{% endfor %}

{% endblock %}

Hero figure · 880px Static
goldenhomes.co.nz
home.html default.html views/layouts

{% extends 'templates/default.html' %}

 

{% set plans = cms.collection('plans')

| sort_by('order') | slice(0, 3) %}

 

{% block body %}

{{ include('components/hero.html') }}

 

{% for plan in plans %}

<article class="plan">

<h3>{{ plan.name }}</h3>

<p>{{ plan.beds }} bed · {{ plan.baths }} bath</p>

</article>

{% endfor %}

{% endblock %}

Animated · once

Feature row · 560px
goldenhomes.co.nz
home.html default.html views/layouts

{% extends 'templates/default.html' %}

 

{% set plans = cms.collection('plans')

| sort_by('order') | slice(0, 3) %}

 

{% block body %}

{{ include('components/hero.html') }}

 

{% for plan in plans %}

<article class="plan">

<h3>{{ plan.name }}</h3>

<p>{{ plan.beds }} bed · {{ plan.baths }} bath</p>

</article>

{% endfor %}

{% endblock %}

Tune · ground and placement
Ground
Place

Overrides none — the file's own defaults